65816 behavior on VICE and true hardware
========================================

Johann Klasek, j AT klasek at
2017-12-02


Testenvironment:

  Hardware:
	Tested on LTC64, a turbo card for the Commodore 64
	in-place of CPU 6510 (which moves to the card)
	with a WDC's 65C816, 32 KByte ROM and 256 KByte RAM.
	based on magazine article c't "C64 aufgemotzt", 1987/06 p. 94
	http://klasek.at/c64/ltc64 (german)
	Redesigned and implemented by Christoph Egretzberger
	and software integration by Johann Klasek

  Software:
	Jamaica Monitor (Jammon) 4.1, native '816
	C64 ROMs (Kernal+BASIC)

---------------------------------------------------------------------
Case 1: Wrap-around for addressing mode "absolute"
	for opcodes TSB, TRB, STX, STY, LDX, LDY

		VICE	WDC
!e
a 1000 clc
xce				native mode
rep #$30			16-bit for X/Y and A/M
lda #$0404			Data Bank Register register
pha				akku in 16 bit
plb				pull DBR twice
plb
lda #$7777			no-wrap marker
sta $050000			to bank 5
sta $058887		
lda #$5555			unchanged marker
sta $048887			into bank 4
ldy #$8888			change marker
tyx				now in X and Y
sty $ffff			high byte of Y is where?
ldy $ffff,x	Y=5555	Y=7777	value for Y comes from which bank?
sty $0002			save as intermediate result, because we do more
lda $ffff	A=7788	A=8888	fetch, does no wrap even on VICE
ldx $0000	X=2088	X=20b5	see if wrapping occured (from sty above)
eor #$ffff	A=8877	A=7777	invert akku, 2nd part ...
trb $ffff	M=0088	M=8888	reset bits (which are already cleared)
tsb $ffff	M=88ff	M=ffff	set these bits giving a $ffff value
ldy $ffff	Y=88ff	Y=ffff	back to ldy test
brk

!d				Jammon alternate display mode
d				disassemble on current PC
m 04ffff			show memory including 050000
m 040000			start of bank 4 (wrap around area),
				and intermediate result in 040002
m 048887			X indexed wrap area
m 058887			X indexed no wrap area
z 1000				start single-stepping
z				single step until BRK or ...
g				go to BRK

Results VICE	WDC

$050001 $77	$77 marker, never changed
$050000 $77	$ff modified by TRB/TSB
$04ffff $ff	$ff modified by TRB/TSB
$040003 $55	$77 read value (low) from LDY $FFFF,X
$040002 $55	$77 read value (high) from LDY $FFFF,X
		    read value 
$040000 $88	??  (if no wrapping for STY $FFFF, TRB/TSB $FFFF)
                    only changed if wrapping
$058888 $77	$77 marker, never changed
$058887 $77	$77 marker, never changed
$048888 $55	$55 marker, never changed
$048887 $55	$55 marker, never changed

A:	$8877	$7777 value from $04ffff/$050000 after STY $FFFF
X:	$??88 	$???? value from $040000/$040001 with high byte of Y 
		      in low byte of X after STY $FFFF
Y:	$88ff	$ffff value from TRB/TSB $FFFF



---------------------------------------------------------------------
Case 2: Wrap-around for Direct Page Indexed Addressing
	in Emulation Mode

### Variant 1

r
# set M X E to "1"
e
# set DBR to 00

a 1000 sec
xce			emulation mode
lda #$20		set highbyte
xba
lda #$00		lowbyte 16-bit akku
tcd			direct page address to $2000
ldx #$20		index
lda #$88		marker for wrap
sta $2010
lda #$77		marker for no-wrap
sta $2110
lda $f0,x		which marker?
stz $f0,x		write (non-6502)
brk

!d			Jammon alternate display mode
d			disassemble on PC
m 2010			show wrap area
m 2110			show no-wrap area
z 1000			start single-stepping
z			single step until BRK or ...
g			go to BRK

Results VICE	WDC

$2010	00	00	wrap area: =00 from STZ
$2110	77 	77	no-wrap area

A:	$2088	$2088	A low: 88 = wrap, 77 = no-wrap


### Variant 2

Based on variant 1:

a 1005 lda #$01		direct page not aligned!
tcd			direct page at $2001
ldx #$1f		correction to hit the
			same memory locations
			for monitoring

g 1000

Results VICE	WDC

$2011	88	88	wrap area: =00 from STZ
$2111	00 	00	no-wrap area

A:	$2077	$2077	A low: 88 = wrap, 77 = no-wrap

